home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / util / allow_once.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  2KB  |  67 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import functools
  5. import logging
  6. log = logging.getLogger('util.allow_once')
  7.  
  8. class Cancel(object):
  9.     
  10.     def __init__(self, value):
  11.         self.value = value
  12.  
  13.  
  14.  
  15. def _key(f_or_name):
  16.     if not isinstance(f_or_name, basestring):
  17.         name = f_or_name.func_name
  18.     else:
  19.         name = f_or_name
  20.     return '_called_%s' % name
  21.  
  22.  
  23. def allow_once(f):
  24.     varname = _key(f)
  25.     
  26.     def wrapper(self, *a, **k):
  27.         
  28.         try:
  29.             d = getattr(self, '_runonce_history')
  30.         except AttributeError:
  31.             d = self._runonce_history = { }
  32.  
  33.         force = k.pop('_runonce_force', False)
  34.         verbose = getattr(self, '_runonce_verbose', False)
  35.         if force or not d.get(varname, False):
  36.             d[varname] = True
  37.             retval = f(self, *a, **k)
  38.             if isinstance(retval, Cancel):
  39.                 if verbose:
  40.                     log.debug('Runonce protection disabled for %r', f)
  41.                 
  42.                 retval = retval.value
  43.                 d.pop(varname, None)
  44.             elif verbose:
  45.                 log.debug('Runonce protection enabled for %r', f)
  46.             
  47.             return retval
  48.         elif verbose:
  49.             log.debug("Didn't call %r", f)
  50.         
  51.  
  52.     wrapper = (None, functools.wraps(f))(wrapper)
  53.     return wrapper
  54.  
  55.  
  56. def reset_allow_once(o, fname = None):
  57.     verbose = getattr(o, '_runonce_verbose', False)
  58.     d = getattr(o, '_runonce_history', { })
  59.     if verbose:
  60.         log.debug('Clearing runonce history for %r (key=%r)', o, fname)
  61.     
  62.     if fname is None:
  63.         d.clear()
  64.     else:
  65.         d.pop(_key(fname), None)
  66.  
  67.